
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

// 利用反射创建对象
public class EmpDemo04 {

    public static void main(String[] args) {

        try {
            // 2. 反射
            // 2.1 创建class对象 ： 全限定路径名： 包名+类名
            // Class 类里 封装了 指定类的相关信息
            // 属性 + 构选器 + 方法 + 创建对象
            Class c1 = Class.forName("org.nextcore.entity.Emp");

            // 1.创建对象的第一种方式: public + 空参
            // Object o = c1.newInstance();

            // 2有参的创建
            // 2.1 获取单个构造器\
            // getConstructor ==> public
            // getDeclaredConstructor ==》 都可以
            // 参数列表指定： 参数的class类型 xx.class
            Constructor cs2 = c1.getConstructor(int.class);
            // 2.2 创建对象
            // Emp emp = new Emp(1002,"李四");
            Object o2 = cs2.newInstance(1002);

            System.out.println(o2.getClass().getMethod("toString").invoke(o2));

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public String toString() {
        return "EmpDemo04 []";
    }
}
